# note: vagrant VM/ansible/docker/serverspec(雑まとめ) ## 動機 - 開発環境を整える環境を最新にする - いいかげんにDockerを触る ## 流れ - MacなのでDockerのためのVMを立ち上げる - VagrantでVM立ち上げる(Ubuntu: 今までRedhat系だったので触ってみる) - VagrantのためのVirtualBoxを5にUpdate - DockerとDockerのコンテナ以外の準備のためのAnsible準備 - 今回はvagrantのprovisioning, bootstrap.shで対応 - playbookの記述 - コンテナをServerspecでテストするのでruby+serverspecも - DockerFileの記述 - こっちでinstall serverspec + α and test いろいろめんどうだったので、流れが変 ## virtualbox - https://www.virtualbox.org/wiki/Downloads - 5.0.20 ## vagrant https://www.vagrantup.com/docs/ ### install - installer - https://www.vagrantup.com/downloads.html - Vagrant 1.8.1 ### VM - https://atlas.hashicorp.com/boxes/search - ubuntu 0.14.0までしかなかった - http://www.vagrantbox.es/ -> 古い - http://opscode.github.io/bento/ -> 消えてた - http://chef.github.io/bento/ に移ってた - https://atlas.hashicorp.com/bento/ bento/ubuntu-16.04 あった ### donwload and settings vagrant-vm-setup.sh ```bash mdkir ~/programming/vagrant/ubuntu && $_ vagrant box add bento/ubuntu-16.04 vagrant init bento/ubuntu-16.04 vagrant up vagrant ssh # or vagrant ssh-config --host ubuntu1604 >> ~/.ssh/config ssh ubuntu1604 # host os touch synced_folder_test # guest os ls /vagrant/synced_folder_test # https://www.vagrantup.com/docs/synced-folders/basic_usage.html ``` vagrant-bootstrap.sh ```bash #!/usr/bin/env bash sudo apt-get update sudo apt-get install -y vim sudo apt-get install -y git wget -q -O- https://bootstrap.pypa.io/get-pip.py | sudo python sudo apt-get install -y ansible # or sudo apt-get install -y python-dev # and sudo pip install ansible ``` Vagrantfile-provisioning ```ruby Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-16.04" config.vm.provision :shell, path: "bootstrap.sh" end # then vagrant halt && vagrant up --provision # or vagrant reload --provision # https://www.vagrantup.com/docs/provisioning/ ``` ## ansible - python製ssh経由でprovisioning(default) - python2.7でも動いた - ansible2系が出てる。騒がれてなかったからbreaking changesは少なさそう ### commands - ansible - ansible-playbook - doc, galaxy, pull, vaultとは? ### ansible command - playbookを使わない - hostの指定が必要(port付きでも良い) ### inventory - http://docs.ansible.com/ansible/intro_inventory.html - default=/etc/ansible/hosts - -i hostfilepath - hostはgroup化できる playbook example ```bash cat < ansible_hosts [local] localhost ansible_connection=local EOF ansible local -i ansible_hosts -m ping ansible all -i ansible_hosts -m shell -a "echo ansible shell module" ``` ### ansible-playbook - playbookを使うとき playbook-example.yml ```yaml ------- - hosts: 127.0.0.1 tasks: - name: ping ping: - hosts: local tasks: - name: shell shell: "echo $item" with_items: - ansible - playbook # command # ansible-playbook -i ansible_hosts playbook-example.yml ``` ## install docker on ubuntu - https://docs.docker.com/engine/installation/linux/ubuntulinux/ - 設定が思っていたよりめんどうだったので、ansible-playbookやめてbootstrap.shに追加した docker_install_for_ubuntu.sh ```bash sudo apt-get install -y apt-transport-https ca-certificates sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" \ > /etc/apt/sources.list.d/docker.list sudo apt-get update sudo apt-get purge lxc-docker sudo apt-get install -y linux-image-extra-$(uname -r) sudo apt-get install -y docker.io sudo apt-get install -y docker-engine sudo service docker start sudo groupadd docker sudo usermod -aG docker vagrant docker run hello-world # without sudo ``` ## docker ecosystem ### brew serachで見つかったもの - boot2docker - docker-machine - Automate Docker provisioning - create VM - docker - client - docker-compose - for multi-container application - docker-swarm - native clustering capabilities to turn a group of Docker engines into a single, virtual Docker Engine. ### docker toolbox https://www.docker.com/products/docker-toolbox, docker関連いろいろ - Docker Engine - Docker Engine runs on Linux to create the operating environment - Compose - Machine - Kitematic - GUI なんのためにubuntu用意したんだ… #### installして使ってみた - install時に設定を行うshell scriptを実行された - `/.docker/machine/machines/default/boot2docker.iso` - VM/SSH等の設定 - VMはVirtualBox上では`default`という名前のメモリ2G - `docker run hello-world` 問題なし - 上記実行終了時に勧められた `docker run -it ubuntu bash` 問題なし - `uname -a` - `Linux 87631664c41b 4.4.8-boot2docker #1 SMP Mon Apr 25 21:57:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux` - ubuntuをcentosにして実行してみても問題なし - unameの結果は同じ - ubuntuではpythonなかったが、centosではあったので中身は違う - itermにしたと思うんだけど、kitematicのDOCKER CLIでterminalが立ち上がらない - なので、下記をitermで実行する - `bash -c "DOCKER_HOST=tcp://192.168.99.100:2376 DOCKER_CERT_PATH=~/.docker/machine/machines/default DOCKER_TLS_VERIFY=1 /bin/zsh"` - shell立ち上げ時に他の設定をするのか、環境変数をただ設定するだけではダメだった ### docker for mac/windows https://blog.docker.com/2016/03/docker-for-mac-windows-beta/ > Docker for Mac can be used at the same time as Docker Toolbox on the same machine, allowing developers to continue using Toolbox as they evaluate Docker for Mac. - betaなのでdocker IDを登録してから使う必要がある - 下記、使用例。toolboxと比べると便利そう - http://paiza.hatenablog.com/entry/docker_for_mac ### その他docker関連 - cloud/hubはdocker社のProduct - betaのときに登録するdocker IDはhubドメインで作る - notary(https://docs.docker.com/notary/getting_started/) ## Dockerfile docker_Dockerfile ```bash # command: docker build -t docker-example:0.0.1 /vagrant/ # Pull base image. FROM ubuntu:16.04 MAINTAINER ksomemo # Install. RUN \ sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \ apt-get update && \ apt-get -y upgrade && \ apt-get install -y build-essential && \ apt-get install -y software-properties-common && \ apt-get install -y byobu curl git htop man unzip vim wget && \ rm -rf /var/lib/apt/lists/* # Ruby dependencies RUN \ apt-get update && \ apt-get install -y \ git tar gcc openssl \ libssl-dev zlib1g-dev libyaml-dev \ libreadline-dev libffi-dev libxml2-dev libxslt-dev # Ruby RUN git clone https://github.com/rbenv/ruby-build.git RUN ./ruby-build/install.sh RUN ruby-build 2.3.1 /usr/local #apt-get update && \ #apt-get install -y ruby2.3 ruby2.3-dev # Install Nginx. RUN \ add-apt-repository -y ppa:nginx/stable && \ apt-get update && \ apt-get install -y nginx && \ rm -rf /var/lib/apt/lists/* && \ #echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \ chown -R www-data:www-data /var/lib/nginx # serverspec # Add files. ADD .gemrc ~/.gemrc ADD Gemfile Gemfile RUN gem update --system RUN gem install bundler RUN bundle install # Set environment variables. ENV HOME /root # Define mountable directories. VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] # Define working directory. WORKDIR /etc/nginx # Expose ports. EXPOSE 80 EXPOSE 443 # Define default command. CMD ["bash"]" ``` - aaa - https://docs.docker.com/engine/reference/builder - 参考ファイル - https://github.com/dockerfile/nginx/blob/master/Dockerfile - https://github.com/dockerfile/ubuntu/blob/master/Dockerfile - FROM でbaseとなるDockerfileを指定できる - nginxは dockerfile/ubuntu - ubuntuは ubuntu:14.04 - 上記は https://hub.docker.com/r/library/ubuntu/ の14.04のこと - 上記は FROM scratch - apt-get update を頻繁にする必要がある? - 一番最初のRUNで実行しているのに二回目のRUNで実行しないとみつからないものがある - apt-get ruby2.3 でインストールしたrubyはruby2.3コマンドになる(gemも同様) - https://github.com/rbenv/ruby-build/wiki を頼った - cacheされることを考えて、1つのRUNに押し込めないほうが試行錯誤しやすい - すでに完了したものをskipできて嬉しい - Gemfileをheredocでは作成できなかったのでADDした - RUN < exit) - docker commit (操作したコンテナからimage作成) ## serverspec dockerコンテナでubuntu環境を整えられたので、コピペしてVM ubuntuでもruby環境を整える serverspec.gemrc ```ruby gem: --no-ri --no-rdoc ``` serverspec.Gemfile ```ruby source 'https://rubygems.org' gem 'rake' gem 'serverspec' gem 'docker-api' ``` `serverspec-init` ``` + spec/ + spec//sample_spec.rb + spec/spec_helper.rb + Rakefile + .rspec ``` ## よくわかってないhashicorp tool - https://speakerdeck.com/muziyoshiz/2015-4q-report - http://keyamb.hatenablog.com/entry/2015/05/28/004337 - https://thinkit.co.jp/story/2015/04/13/5875